package com.woniu.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Map;

@Slf4j
@Component
public class JwtUtils {
    // 定义密钥签名
    private static String singKey = "woniu";
    // 定义密钥过期时间 一小时
    private static long expire = 1000 * 60 * 60;

    /**
     * 获取IP地址的方法
     */
    public String getRequestIP(HttpServletRequest request) {
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }

    /**
     * 生成Jwt令牌
     * @param claims JWT第二部分， payload中的存储内容
     * @return 返回生成jwt令牌 （String类型）
     */
    public static String generateJwt(Map<String, Object> claims) {
        String jwt = Jwts.builder()
                .addClaims(claims)  // 自定义信息（payLoad）
                .signWith(SignatureAlgorithm.HS256, singKey) // 签名算法
                .setExpiration(new Date(System.currentTimeMillis() + expire))
                .compact();
        return jwt;
    }

    /**
     * 解析令牌
     * @param jwt JWT令牌
     * @return
     */
    public static Claims parseJwt(String jwt) {
        Claims claims = Jwts.parser()
                .setSigningKey(singKey)
                .parseClaimsJws(jwt)
                .getBody();
        return claims;
    }

//    /**
//     * 解析Token
//     */
//    public Jws<Claims> parseToken(String token) {
//        return Jwts.parser()
//                .setSigningKey(singKey)
//                .parseClaimsJws(token);
//    }

    /**
     * 判断Token前面是否有Bearer字符串
     *
     * @return 返回一个Token
     */
    public String getToken(String auth) {
        //Token不为空，而且长度大于7，并且以Bearer开头
        if (auth != null && auth.length() > 7 && auth.startsWith("Bearer ")) {
            //从第7个开始取子字符串
            return auth.substring(7);
        }
        return auth;
    }

    /**
     * 获取指定的值
     */
    public String getValue(String token, String key) {
        //对Token进行处理
        token = getToken(token);
        //解析Token，判断Token是否合法
        //获取载荷
        Claims claims = parseJwt(token);
        //获取指定的值
        return claims.get(key).toString();
    }

    /**
     * 验证JWT是否有效方法
     */
    public boolean validateToken(String token) {
        //直接调用上面的方法进行解析
        try {
            Claims claims = parseJwt(token);
            return true;
        } catch (Exception e) {
            log.info("验证Token失败:{}", e.getMessage());
            return false;
        }
    }


}
